package org.xx.armory.config;


import static org.xx.armory.commons.Validators.notNull;

/**
 * 配置提供程序的工厂，用于获取当前配置提供程序
 *
 * @author Haart
 */
public final class ConfigurationManager {
    private static volatile ConfigurationProvider instance;

    private ConfigurationManager() {
        throw new UnsupportedOperationException();
    }

    /**
     * 注册配置提供程序
     *
     * <p>
     * <strong>此方法供配置提供程序内部使用，永远不应当从外部调用！</strong>
     * </p>
     *
     * @param provider
     *         需要被设置为当前配置提供程序的对象
     * @throws NullPointerException
     *         如果参数{@code provider}的值是{@code null}。
     */
    public static void register(
            ConfigurationProvider provider
    ) {
        notNull(provider, "provider");

        instance = provider;
    }

    /**
     * 加载配置项。
     *
     * @return 已加载的配置项。
     * @throws NullPointerException
     *         如果之前没有注册过任何配置提供程序。
     */
    public static Configuration getConfiguration() {
        if (instance == null) {
            throw new NullPointerException("configurationProvider has not been registered");
        }

        return instance.get();
    }
}
